﻿using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Xml.Linq;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            IConnectionFactory factory = new ConnectionFactory//创建连接工厂对象
            {
                HostName = "192.168.137.101",//IP地址
                Port = 5672,//端口号
                VirtualHost = "/jet-test",
                UserName = "guest",//用户账号
                Password = "guest"//用户密码
            };
            IConnection con = factory.CreateConnection();//创建连接对象
            IModel channel = con.CreateModel();//创建连接会话对象
            
            var arg=new Dictionary<string, object>();
            arg.Add("x-message-ttl",6000);

            //声明一个队列
            channel.QueueDeclare(
                  queue: "queue1",//消息队列名称
                  durable: false,//是否持久化,true持久化,队列会保存磁盘,服务器重启时可以保证不丢失相关信息。
                  exclusive: false,//是否排他,true排他的,如果一个队列声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除.
                  autoDelete: false,//是否自动删除。true是自动删除。自动删除的前提是：致少有一个消费者连接到这个队列，之后所有与这个队列连接的消费者都断开时,才会自动删除.
                  arguments: arg //一般设置为null，设置队列的一些其它参数,比如存活时间
               );

            //将channel设置成事务模式
            channel.TxSelect();
            //提交事务
            channel.TxCommit();
            // 回滚事务
            channel.TxRollback();

            //开启发送方确认模式
            channel.ConfirmSelect();
            // 返回true表示成功
            channel.WaitForConfirms();
            //拒绝消息    requeue 是否重新入队  如果只有一个消费者 千万别这么弄，
            // 因为这样会导致 一直死循环
            channel.BasicReject(1,requeue:false);
            //批量拒绝 requeue 是否重新入队列
            channel.BasicNack(1,true,requeue:false);
            //手工应答，不应答一直会存在，重新链接会重复消费
            channel.BasicAck(1,true);


            // 也可以对每条消息设置过期时间
            Console.WriteLine("Hello World!");
        }
    }
}
